package cn.doourbest.learnspring.leetcode;

/**
 * @description:
 * @author: zhangsc
 * @create: 2019/12/26
 *
 * 有一个长度为 arrLen 的数组，开始有一个指针在索引 0 处。
 *
 * 每一步操作中，你可以将指针向左或向右移动 1 步，或者停在原地（指针不能被移动到数组范围外）。
 *
 * 给你两个整数 steps 和 arrLen ，请你计算并返回：在恰好执行 steps 次操作以后，指针仍然指向索引 0 处的方案数。
 *
 * 由于答案可能会很大，请返回方案数 模 10^9 + 7 后的结果。
 *
 *  
 *
 * 示例 1：
 *
 * 输入：steps = 3, arrLen = 2
 * 输出：4
 * 解释：3 步后，总共有 4 种不同的方法可以停在索引 0 处。
 * 向右，向左，不动
 * 不动，向右，向左
 * 向右，不动，向左
 * 不动，不动，不动
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/number-of-ways-to-stay-in-the-same-place-after-some-steps
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
class Solution {

    private static int tt = 0;

    private static final int ff = 1000000007;
    public int numWays(int steps, int arrLen) {
        tt = 0;
        if(steps == 0 ){
            return 0;
        }
        if(arrLen == 1){
            return 1;
        }

        int maxLen = 0;
        if(steps / 2 > arrLen){
            maxLen = arrLen;
        }else{
            maxLen = steps / 2;
        }
        int[][] f = new int[steps + 1][arrLen];

        f[0][0] = 1;
        for (int i = 1; i <= steps; ++i) {
            for (int j = 0; j < arrLen; ++j) {
                for (int k = -1; k <= 1; ++k) {
                    if (j - k >= 0 && j - k < arrLen) {
                        f[i][j] = (f[i][j] + f[i - 1][j - k]) % ff;
                        System.out.println("f[" + i +"][" + j + "] = (f["+ i +"]["+ j +"] + f[" + (i - 1) + "][" + (j - k)+"]) % ff;" +
                                "====" + f[i][j] + "+" + f[i - 1][j - k]);
                    }
                }
            }
        }

        // f 10  = f10 + f01
        return f[steps][0];



       // findWayTOZero(0,arrLen,steps,maxLen);

        //return tt % ff;
    }
    private void findWayTOZero(int index,int length,int steps,int maxLen){


        if(index == 0 && steps == 0){
            tt += 1;
            return;
        }

        if(steps == 0){
            return;
        }
        if(index > steps){
            return;
        }

        if(index > maxLen){
            return;
        }

        int[] a = new int[2];

        for( int i = steps; i >= 1; i--){

            for(int j = 0; j < maxLen; j++){

                for(int k = -1; k <= 1; k++){
                }
            }
        }

        if(index > 0){
            findWayTOZero(index-1,length,steps - 1,maxLen);
        }
        if(index + 1 < length){
            findWayTOZero(index+1,length,steps - 1,maxLen);
        }
        findWayTOZero(index,length,steps - 1,maxLen);
    }

    public static void main(String[] args) {
        System.out.println(new Solution().numWays(27,7));
        System.out.println(new Solution().numWays(1,7));
        System.out.println(new Solution().numWays(2,7));
        System.out.println(new Solution().numWays(3,7));
        System.out.println(new Solution().numWays(4,7));
        System.out.println(new Solution().numWays(5,7));
        System.out.println(new Solution().numWays(6,7));
        System.out.println(new Solution().numWays(7,7));
        System.out.println(new Solution().numWays(8,7));
    }


}
